package org.example.font.service.impl;


import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.example.font.mapper.EmpExprMapper;
import org.example.font.mapper.EmpMapper;
import org.example.font.model.*;
import org.example.font.service.EmpService;
import org.example.font.utils.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.lang.reflect.Array;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private EmpExprMapper empExprMapper;
    @Override
    public PageResult page(EmpQueryParam param) {
        // 设置分页参数
        PageHelper.startPage(param.getPage(), param.getPageSize());
        // 执行查询
        List<Emp> empList = empMapper.list(param);
        Page<Emp> p = (Page<Emp>) empList;
        // 封装结果
        return  new PageResult(p.getTotal(), p.getResult());
    }

    @Override
    @Transactional // 开启事务
    public void add(Emp emp) {
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        // 员工基本信息
        empMapper.insert(emp);
        // 保存员工工作信息
        Integer empId = emp.getId();
        System.out.println("返回的员工id: " + empId);
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)) {
            exprList.forEach(empExpr -> empExpr.setEmpId(empId));
            empExprMapper.insertBatch(exprList);
        }
    }

    @Override
    @Transactional
    public void deleteById(List<Integer> ids) {
        // 删除员工的基本信息
        empMapper.deleteById(ids);
        // 删除员工的工作经历信息
        empExprMapper.deleteByEmpIds(ids);
    }

    @Override
    public Emp findById(Integer id) {
        Emp emp = empMapper.findById(id);
        List<EmpExpr> exprList = empExprMapper.findByEmpId(id);
        emp.setExprList(exprList);
        return emp;
    }

    @Override
    public void updateEmp(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());
        // 更新员工基本信息
        empMapper.update(emp);
        // 更新员工工作经历：实际是删除之后新增，因为原本可能有2条信息，可能被更新为3条
        empExprMapper.deleteByEmpIds(Arrays.asList(emp.getId()));
        Integer empId = emp.getId();
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)) {
            exprList.forEach(empExpr -> empExpr.setEmpId(empId));
            empExprMapper.insertBatch(exprList);
        }
    }

    @Override
    public List<Emp> findAll() {

        return empMapper.findAll();
    }

    @Override
    public LoginInfo login(Emp emp) {
        Emp result = empMapper.login(emp);
        if (result == null) {
            return null;
        }
        Map<String, Object> claims = new HashMap<>();
        claims.put("id", result.getId());
        claims.put("name", result.getName());
        String token = JwtUtil.generateToken(claims);
        return new LoginInfo(result.getId(), result.getUsername(), result.getName(), token);
    }
}
